package com.qianfeng.iot.sdk.service.impl;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import com.dc3.common.bean.driver.AttributeInfo;
import com.dc3.common.bean.point.PointValue;
import com.dc3.common.model.Device;
import com.qianfeng.iot.sdk.bean.driver.DriverContext;
import com.qianfeng.iot.sdk.service.DriverCommandService;
import com.qianfeng.iot.sdk.service.DriverCustomService;
import com.qianfeng.iot.sdk.service.DriverService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Created by Jackiechan on 2022/7/25 15:29
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
@Service
public class DriverCommandServiceImpl implements DriverCommandService {

    private DriverContext driverContext;


    private DriverCustomService driverCustomService;


    private DriverService driverService;


    @Autowired
    public void setDriverService(DriverService driverService) {
        this.driverService = driverService;
    }

    @Autowired
    public void setDriverCustomService(DriverCustomService driverCustomService) {
        this.driverCustomService = driverCustomService;
    }

    @Autowired
    public void setDriverContext(DriverContext driverContext) {
        this.driverContext = driverContext;
    }

    @Override
    public PointValue read(String deviceId, String pointId) {
        //先根据设备的id获取到设备的数据
        Device device = driverContext.getDeviceByDeviceId(deviceId);
        //具体怎么读取数据其实应该是具体的驱动要做的事情
        //所以这个操作应该像jdbc那样,交给具体的实现类去做
        try {
            String rawString = driverCustomService.read(driverContext.getDriverInfoByDeviceId(deviceId), driverContext.getPointInfoByDeviceIdAndPointId(deviceId, pointId), device, driverContext.getPointByDeviceIdAndPointId(deviceId, pointId));
            //创建一个位号数据,里面保存了设备的id,位号的id,原始的数据,和处理后的数据
            //这个位号数据需要格式化处理,为什么呢? 比如我们的mqtt中有一个qos,是一个数字,代表不同的消息的发送类型,但是我们现在查询到的是一个字符串
            //所以我们需要对他进行转换,转成对应的类型,不然我们在调用方法时候会提示错误,特别是类型转换异常
            //还有一种情况,就是我们为了方便统一代码,减少复杂的逻辑,我们会将所有的数据都以字符串的方式进行操作,但是你传递过来的这个字符串或者这个数据格式可能不符合我我们的要求
            //所以我们还需要进行转换一下,还有一些可能,你传递的数据期望是一个数字,但是可以写字符串,但是这个字符串本身其实应该是数字,可能会存在范围要求
            //转换的时候可以进行范围的判断
            PointValue pointValue = new PointValue(deviceId, pointId, rawString, driverService.convertValue(deviceId, pointId, rawString));

            return pointValue;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Boolean write(String deviceId, String pointId, String value) {
        Device device = driverContext.getDeviceByDeviceId(deviceId);
        try {
            //没有数据
//            Map<String, AttributeInfo> driverInfo = new HashMap<>();
//            Map<String, AttributeInfo> pointInfo = new HashMap<>();
//            AttributeInfo topic = new AttributeInfo("zheshisha","String");
//            AttributeInfo qos = new AttributeInfo("1","int");
//            pointInfo.put("commandTopic", topic);
//            pointInfo.put("commandQos", qos);
//            Device device1 = new Device();
//            AttributeInfo attributeInfo = new AttributeInfo("这是我们要发送的数据","String");
            return driverCustomService.write(driverContext.getDriverInfoByDeviceId(deviceId),driverContext.getPointInfoByDeviceIdAndPointId(deviceId,pointId),device,new AttributeInfo(value,driverContext.getPointByDeviceIdAndPointId(deviceId,pointId).getType()));
//            return driverCustomService.write(driverInfo, pointInfo, device1, attributeInfo);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
